package cn.iocoder.yudao.module.xiaoBizHandler.service.codegen.newInner.yudao.singleTableCRUD;

import cn.iocoder.yudao.module.xiaoBizHandler.dal.dataobject.codegen.XiaoBizHandlerCodegenColumnDO;
import cn.iocoder.yudao.module.xiaoBizHandler.dal.dataobject.codegen.XiaoBizHandlerCodegenTableDO;
import cn.iocoder.yudao.module.xiaoBizHandler.service.codegen.newInner.yudao.template.CodeGenTemplate;
import cn.iocoder.yudao.module.xiaoBizHandler.service.codegen.newInner.GlobalBinding;
import cn.iocoder.yudao.module.xiaoBizHandler.service.codegen.newInner.LocalBinding;
import cn.iocoder.yudao.module.xiaoBizHandler.service.codegen.newInner.yudao.template.java.controller.Controller;
import cn.iocoder.yudao.module.xiaoBizHandler.service.codegen.newInner.yudao.template.java.controller.vo.*;
import cn.iocoder.yudao.module.xiaoBizHandler.service.codegen.newInner.yudao.template.java.convert.Convert;
import cn.iocoder.yudao.module.xiaoBizHandler.service.codegen.newInner.yudao.template.java.dal.DO;
import cn.iocoder.yudao.module.xiaoBizHandler.service.codegen.newInner.yudao.template.java.dal.Mapper;
import cn.iocoder.yudao.module.xiaoBizHandler.service.codegen.newInner.yudao.template.java.dal.Mapper_Xml;
import cn.iocoder.yudao.module.xiaoBizHandler.service.codegen.newInner.yudao.template.java.enums.ErrorCode;
import cn.iocoder.yudao.module.xiaoBizHandler.service.codegen.newInner.yudao.template.java.service.Service;
import cn.iocoder.yudao.module.xiaoBizHandler.service.codegen.newInner.yudao.template.java.service.ServiceImpl;
import cn.iocoder.yudao.module.xiaoBizHandler.service.codegen.newInner.yudao.template.java.test.ServiceTest;
import cn.iocoder.yudao.module.xiaoBizHandler.service.codegen.newInner.yudao.template.sql.H2;
import cn.iocoder.yudao.module.xiaoBizHandler.service.codegen.newInner.yudao.template.sql.Sql;
import cn.iocoder.yudao.module.xiaoBizHandler.service.codegen.newInner.yudao.template.vue.api.Api_js;
import cn.iocoder.yudao.module.xiaoBizHandler.service.codegen.newInner.yudao.template.vue.views.Index_vue;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import javax.annotation.PostConstruct;
import java.util.*;


@Component
public class SingleTableCrud {

    List<CodeGenTemplate> templateList = new LinkedList<>();

    @Autowired
    BaseVO baseVO;

    @Autowired
    CreateReqVO createReqVO;

    @Autowired
    ExcelVO excelVO;

    @Autowired
    ExportReqVO exportReqVO;

    @Autowired
    PageReqVO pageReqVO;

    @Autowired
    RespVO respVO;

    @Autowired
    UpdateReqVO updateReqVO;

    @Autowired
    Controller controller;

    @Autowired
    Convert convert;

    @Autowired
    DO dO;

    @Autowired
    Mapper mapper;

    @Autowired
    Mapper_Xml mapper_Xml;

    @Autowired
    ErrorCode errorCode;

    @Autowired
    Service service;

    @Autowired
    ServiceImpl serviceImpl;

    @Autowired
    ServiceTest serviceTest;

    @Autowired
    H2 h2;

    @Autowired
    Sql sql;

    @Autowired
    Api_js api_js;

    @Autowired
    Index_vue index_vue;

    @PostConstruct
    private void initTemplateList() {
        templateList.add(baseVO);
        templateList.add(createReqVO);
        templateList.add(excelVO);
        templateList.add(exportReqVO);
        templateList.add(pageReqVO);
        templateList.add(respVO);
        templateList.add(updateReqVO);
        templateList.add(controller);
        templateList.add(convert);
        templateList.add(dO);
        templateList.add(mapper);
        templateList.add(mapper_Xml);
        templateList.add(errorCode);
        templateList.add(service);
        templateList.add(serviceImpl);
        templateList.add(serviceTest);
        templateList.add(h2);
        templateList.add(sql);
        templateList.add(api_js);
        templateList.add(index_vue);
    }


    public Map<String, String> genCodes(XiaoBizHandlerCodegenTableDO table, List<XiaoBizHandlerCodegenColumnDO> columns, GlobalBinding globalBinding, LocalBinding localBinding, XiaoBizHandlerCodegenColumnDO primaryColumn) {
        Map<String, String> rs = new LinkedHashMap<>();
        templateList.forEach(template -> {
            String path = template.getPath(table, columns, globalBinding, localBinding, primaryColumn);
            // 不能有空格
            path = path.replace(" ", "");
            rs.put(path
                    , template.render(table, columns, globalBinding, localBinding, primaryColumn));
        });
        return rs;
    }


}
